<?php
/**
 * Created by PhpStorm.
 * User: River
 * Email: river0428@gmail.com
 * Date: 2018/12/18
 * Time: 上午10:34
 */

namespace Modules\Api\Controllers;

use App\Models\Pay;
use EasyWeChat\Factory;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Request;
use Modules\Service\Logic\PayLogic;
use Yansongda\Pay\Pay as YSpay;

class
PaymentNotifyController extends Controller
{

    public function alipay()
    {
        $alipay = YSpay::alipay(config('pay.alipay'));

        try{
            $data = $alipay->verify(); // 是的，验签就这么简单！
            //$data = ['trade_status'=>'TRADE_SUCCESS','out_trade_no'=>1234567891111,'trade_no'=>199];
            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况
//            \App\Helpers\Log::write('info', '异步回调参数'.Request::instance()->getContent(), 'alipay');
//            // 验证请求。
//            if (!$data) {
//                Log::notice('Alipay notify post data verification fail.', [
//                    'data' => Request::instance()->getContent()
//                ]);
//                return 'fail';
//            }

            // 判断通知类型。
            switch ($data->trade_status) {
                case 'TRADE_SUCCESS':
                    // TODO: 支付成功，取得订单号进行其它相关操作。
                    Log::debug('Alipay notify get data verification success.', [
                        'out_trade_no' => $data->out_trade_no,
                        'trade_no' => $data->trade_no
                    ]);

                    $paySN = $data->out_trade_no;
                    $pay = Pay::where('pay_sn', $data->out_trade_no)->first();

                    if(!$pay){
                        @file_put_contents(storage_path() . '/' . date('Y-m-d') . '.txt',$paySN . PHP_EOL,FILE_APPEND);
                    }

                    Log::info($data->out_trade_no );
                    if ($pay->is_paid) {
                        break;
                    }



                    if(Pay::isYouKaOrder($paySN)){
                        Pay::setPaid($pay);
                    }
                    if(Pay::isHuaFeiOrder($paySN)){
                        Pay::setPaid_two($pay);
                    }

                    if(PayLogic::isShopOrder($paySN)){
                        PayLogic::doShop($paySN);
                    }

                    /*
                    $str = substr($pay->str_sn, 0, 5);

                    if ($pay) {
                        if($str == 'huafe') {
                            Pay::setPaid_two($pay);
                        }else{
                            Pay::setPaid($pay);
                        }
                    } else {
                        Log::error('未找到支付单号的订单, out_trade_no: ' . Input::get('out_trade_no'));
                    }
                    */
                    break;
                case 'TRADE_FINISHED':

            }

            Log::debug('Alipay notify', $data->all());
        } catch (\Exception $e) {
            // $e->getMessage();
        }

        return $alipay->success();// laravel 框架中请直接 `return $alipay->success()`
    }
//    public function alipay()
//    {
//        \App\Helpers\Log::write('info', '异步回调参数'.Request::instance()->getContent(), 'alipay');
//        // 验证请求。
//        if (!app('alipay.mobile')->verify()) {
//            Log::notice('Alipay notify post data verification fail.', [
//                'data' => Request::instance()->getContent()
//            ]);
//            return 'fail';
//        }
//
//        // 判断通知类型。
//        switch (Input::get('trade_status')) {
//            case 'TRADE_SUCCESS':
//                // TODO: 支付成功，取得订单号进行其它相关操作。
//                Log::debug('Alipay notify get data verification success.', [
//                    'out_trade_no' => Input::get('out_trade_no'),
//                    'trade_no' => Input::get('trade_no')
//                ]);
//
//                $paySN = Input::get('out_trade_no');
//
//                $pay = Pay::where('pay_sn', Input::get('out_trade_no'))->first();
//
//                if(!$pay){
//                    @file_put_contents(storage_path() . '/' . date('Y-m-d') . '.txt',$paySN . PHP_EOL,FILE_APPEND);
//                }
//
//                Log::info(Input::get('out_trade_no'));
//                if ($pay->is_paid) {
//                    break;
//                }
//
//
//
//                if(Pay::isYouKaOrder($paySN)){
//                    Pay::setPaid($pay);
//                }
//                if(Pay::isHuaFeiOrder($paySN)){
//                    Pay::setPaid_two($pay);
//                }
//
//                if(PayLogic::isShopOrder($paySN)){
//                    PayLogic::doShop($paySN);
//                }
//
//                /*
//                $str = substr($pay->str_sn, 0, 5);
//
//                if ($pay) {
//                    if($str == 'huafe') {
//                        Pay::setPaid_two($pay);
//                    }else{
//                        Pay::setPaid($pay);
//                    }
//                } else {
//                    Log::error('未找到支付单号的订单, out_trade_no: ' . Input::get('out_trade_no'));
//                }
//                */
//                \App\Helpers\Log::write('info', '支付成功', 'alipay');
//                break;
//            case 'TRADE_FINISHED':
//
//        }
//
//        return 'success';
//    }

    public function weixinApp()
    {
        $app = Factory::payment(config('wechat.app_pay'));
        $response = $app->handlePaidNotify(function($message, $fail){
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            $pay = Pay::where('pay_sn', $message['out_trade_no'])->first();
            Log::error($message['out_trade_no']);
            if(!$pay){
                @file_put_contents(storage_path() . '/' . date('Y-m-d') . '.txt',$message['out_trade_no'] . PHP_EOL,FILE_APPEND);
            }
            if ($pay->is_paid) {
                return true;
            }

            $paySN = $message['out_trade_no'];

            if(Pay::isYouKaOrder($paySN)){
                Pay::setPaid($pay);
            }
            if(Pay::isHuaFeiOrder($paySN)){
                Pay::setPaid_two($pay);
            }

            if(PayLogic::isShopOrder($paySN)){
                PayLogic::doShop($paySN);
            }

            /*
            $str = substr($pay->str_sn, 0, 5);
            if ($pay) {
                if($str == 'huafe') {
                    Pay::setPaid_two($pay);
                }else{
                    Pay::setPaid($pay);
                }
            }else {
                Log::error('未找到支付单号的订单, out_trade_no: ' . Input::get('out_trade_no'));
            }
            */

            return true; // 返回处理完成
        });

        $response->send(); // return $response;
    }

    public function weixin()
    {
        $app = Factory::payment(config('wechat.wx_pay'));
        $response = $app->handlePaidNotify(function($message, $fail){
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            $pay = Pay::where('pay_sn', $message['out_trade_no'])->first();

            if(!$pay){
                @file_put_contents(storage_path() . '/' . date('Y-m-d') . '.txt',$message['out_trade_no'] . PHP_EOL,FILE_APPEND);
            }

            //Log::error($pay->pay_sn);
            if ($pay->is_paid) {
                return true;
            }

            $paySN = $message['out_trade_no'];

            if(Pay::isYouKaOrder($paySN)){
                Pay::setPaid($pay);
            }
            if(Pay::isHuaFeiOrder($paySN)){
                Pay::setPaid_two($pay);
            }

            if(PayLogic::isShopOrder($paySN)){
                PayLogic::doShop($paySN);
            }
            //
            /*
            $str = substr($pay->str_sn, 0, 5);

            if ($pay) {
                if($str == 'huafe') {
                    Pay::setPaid_two($pay);
                }else{
                    Pay::setPaid($pay);
                }
            }else {
                Log::error('未找到支付单号的订单, out_trade_no: ' . Input::get('out_trade_no'));
            }
            */

            return true; // 返回处理完成
        });

        $response->send(); // return $response;
    }
}